home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Games Collection 1 / software vault.zip / software vault / CDR10 / OS2LIB.ZIP / XSOURCE.ZIP / xlibos2.c < prev    next >
Text File  |  1993-05-22  |  8KB  |  406 lines

  1. #define INCL_BASE
  2. #define INCL_SUB
  3. #define HANDLE 0
  4. #define XRES 320
  5. #define XRES_BYTES 80
  6. #define YRES 240
  7. #define NUM 5
  8.  
  9. #define SC_INDEX 0x3c4
  10. #define GC_INDEX 0x3ce
  11. #define CRTC_INDEX 0x3d4
  12. #define CRT_C 0x3d5
  13. #define MISC_OUT 0x3c2
  14. #define MISC_OUTPUT 0x3c2
  15.  
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <os2.h>
  19.  
  20.  
  21.  
  22. extern _Far16 _Pascal outp(USHORT, UCHAR);
  23. extern _Far16 _Pascal outpw(USHORT, USHORT);
  24. extern UCHAR _Far16 _Pascal inp(USHORT);
  25. extern USHORT _Far16 _Pascal inpw(USHORT);
  26. extern void draw(PCH,ULONG);
  27.  
  28.  
  29.  
  30. PCH screen;
  31. CHAR ActivePage;
  32. CHAR VisualPage;
  33. USHORT SCREEN_Width=20;
  34. struct _VIOPHYSBUF phys;
  35. struct _VIOMODEINFO orig,moda;
  36. PCH XPage[4];
  37.  
  38. struct SPRITE_INFO {
  39.      PCHAR image;
  40.      char xs,ys;
  41.      int x,y;
  42.      int spx,spy;
  43.      char xdir,ydir;
  44. };
  45.  
  46. struct IMAGE_TABLE {
  47.      PCHAR img[4];
  48. };
  49.  
  50. struct PAGE_TABLE {
  51.      PCHAR p[4];
  52. };
  53.  
  54.  
  55. int InitModeX(struct PAGE_TABLE *page_table)
  56. {
  57.   char tmp;
  58.   int i;
  59.   USHORT ModeXTable[]={0x0d06,0x3e07,0x4109,0xea10,0xac11,0xdf12,\
  60.            0x0014,0xe715,0x0616,0xe317};
  61.  
  62.   phys.pBuf=(unsigned char *) 0xA0000;
  63.   phys.cb=128000;
  64.   moda.cb=12;
  65.   moda.fbType=3;
  66.   moda.color=8;
  67.   moda.col=40;
  68.   moda.row=25;
  69.   moda.hres=320;
  70.   moda.vres=200;
  71.   VioGetMode(&orig, HANDLE);
  72.   VioSetMode(&moda, HANDLE);
  73.   VioGetPhysBuf(&phys,0);
  74.   screen=MAKEP(phys.asel[0], 0);
  75.  
  76.   outpw((USHORT) SC_INDEX ,0x0604);
  77.   outpw((USHORT) SC_INDEX ,0x0100);
  78.   outp((USHORT) MISC_OUTPUT,0xe3);
  79.   outpw((USHORT) SC_INDEX,0x0300);
  80.   outp((USHORT) CRTC_INDEX,0x11);
  81.   tmp=inp((USHORT)CRT_C);
  82.   tmp=tmp & 0x7f;
  83.   outp(CRT_C,tmp);
  84.  
  85.   for (i=0;i<10;i++)
  86.       outpw((USHORT)CRTC_INDEX,ModeXTable[i]);
  87.  
  88.   outpw((USHORT)SC_INDEX,0x0f02);
  89.   XPage[0]=screen;
  90.   XPage[1]=screen+19200;
  91.   XPage[2]=screen+38400;
  92.   XPage[3]=XPage[2]+19200;
  93.  
  94.   for (i=0;i<4;i++) 
  95.      page_table->p[i]=XPage[i];
  96.   
  97.  
  98.   ActivePage=0;
  99.   VisualPage=0;
  100.   DosSetPriority(0,PRTYC_TIMECRITICAL,30,0);
  101. }
  102.  
  103.  
  104. void XPixel(int x,int y, char Color)
  105. {
  106.   int loc,tmp;
  107.   char c;
  108.  
  109.   loc=((y * (SCREEN_Width<<2))+(x>>2))+(ActivePage*19200);
  110.   x=x & 0x03;
  111.   c=0x01;
  112.   c=c<<x;
  113.   tmp=(c<<8)+0x02;
  114.   outpw(SC_INDEX,tmp);
  115.   screen[loc]=Color;
  116. }
  117.  
  118.  
  119. int XReadPixel(int x, int y)
  120. {
  121.   int loc,tmp;
  122.   char c;
  123.  
  124.   loc=((y * 80)+(x>>2))+(ActivePage*19200);
  125.   x=x & 0x03;
  126.   tmp=(x<<8) & 0x04;
  127.   outpw(GC_INDEX,tmp);
  128.   return screen[loc];
  129. }
  130.  
  131.  
  132. int CloseModeX(void)
  133. {
  134.   VioSetMode(&orig, HANDLE);
  135. }
  136.  
  137.  
  138. void XSelectPlane(char plane)
  139. {
  140.   int tmp;
  141.  
  142.   plane=plane & 0x0f;
  143.   outpw((USHORT)SC_INDEX,(plane<<8) & 0x02);
  144.   tmp=(plane<<8) & 0x04;
  145.   outpw(GC_INDEX,tmp);
  146. }
  147.  
  148.  
  149. int XCls(char color)
  150. {
  151.   int count;
  152.  
  153.   outpw((USHORT)SC_INDEX,0x0f02);
  154.   memset(screen,color,64000);
  155. }
  156.  
  157.  
  158. XBoxAt(int x1,int y1,int x2,int y2,char color)
  159. {
  160.   unsigned int y,lx,ly,ux,uy;
  161.   unsigned long tmp;
  162.   int size;
  163.   ULONG pageadder;
  164.  
  165.   x1=x1>>2;
  166.   x2=x2>>2;
  167.   size=x2-x1;
  168.   lx=min(x1,x2);
  169.   ux=max(x1,x2);
  170.   ly=min(y1,y2);
  171.   uy=max(y1,y2);
  172.   pageadder=19200*ActivePage;
  173.  
  174.   tmp=SCREEN_Width<<2;
  175.   outpw((USHORT)SC_INDEX,0x0f02); /* all pages */
  176.   for (y=(ly*tmp)+x1; y<=uy*tmp; y+=tmp) {
  177.        memset(&screen[pageadder+y],color,size);
  178.   }
  179. }
  180.  
  181.  
  182.  
  183. void XWaitRetrace(void)
  184. {
  185.    char ret;
  186. /* some prob here I'll fix it later */
  187.    while ((inp(0x3da)&0x08)!=0);
  188.    while ((inp(0x3da)&0x08)==0);
  189. }
  190.  
  191. void XWaitPeriod(void)
  192. {
  193.    char ret;
  194.  
  195.    while ((inp(0x3da)&0x08)==0);
  196.    while ((inp(0x3da)&0x08)!=0);
  197. }
  198.  
  199. void XCopyFromPageToPage(char SourcePage,int x,int y,int xs,int ys,char DestPage,int dx,int dy)
  200. {
  201.    ULONG i,a,source,dest;
  202.    char *td,*ts;
  203.  
  204.    dest=(dx>>2)+(dy*80)+(19200*DestPage);
  205.    source=(x>>2)+(y*80)+(19200*SourcePage);
  206.    xs=(xs>>2);
  207.  
  208.    outpw(0x03ce,0x0008);
  209.    outpw(SC_INDEX,0x0f02);
  210.  
  211.    for (i=0;i<ys;i++ ) {
  212.       for (a=0;a<xs;a++) 
  213.          screen[dest+a]=screen[source+a];
  214.       dest=dest+80;
  215.       source=source+80;
  216.    }
  217.  
  218.    outp(0x03cf,0xff);
  219. }
  220.  
  221. void XSetVisualPage(char page)
  222. {
  223.    char tmp;
  224.    char low,hi;
  225.    USHORT offset;
  226.  
  227.    offset=page*19200;
  228.    low=(offset & 0x0ff);
  229.    hi=(offset >> 8);
  230.    VisualPage=page;
  231.  
  232.    do{
  233.     tmp=inp(0x3da);
  234.    } while ((tmp & 0x08)!=0);
  235.  
  236.    outp(0x03d4,0x0c);
  237.    outp(0x03d5,hi);
  238.    outp(0x03d4,0x0d);
  239.    outp(0x03d5,low);
  240.  
  241.    do{
  242.     tmp=inp(0x3da);
  243.    } while ((tmp & 0x08)==0);
  244. }
  245.  
  246. void XSetActivePage(char page)
  247. {
  248.    ActivePage=page;
  249. }
  250.  
  251. void XSetPan(USHORT pan)
  252. {
  253.    pan=pan>>2;
  254.    outpw(0x03d4,0x000d);
  255.    outpw(0x03d5,(pan & 0x0ff));
  256. }
  257.  
  258. void XBltImage(int x,int y,char xs, char ys, char *image)
  259. {
  260.   int loc,tmp,tx,ty;
  261.   char c,StartPlane;
  262.   int a=0,pagenum;
  263.   USHORT page[4]={0x102,0x0202,0x0402,0x0802};
  264.  
  265.   StartPlane=(x & 0x03);
  266.   loc=((y * (SCREEN_Width<<2))+(x>>2));
  267.   loc=loc+(ActivePage*19200);
  268.  
  269.   for (pagenum=0;pagenum<4;pagenum++){
  270.      tmp=loc;
  271.      outpw(SC_INDEX,page[StartPlane]);  /*pagenum*/
  272.      StartPlane=StartPlane + 1;
  273.      if (StartPlane==4) {
  274.         StartPlane=0;
  275.         loc++;
  276.      }
  277.      for (ty=0;ty<(ys);ty++) {
  278.         for(tx=0;tx<(xs>>2);tx++){
  279.            screen[tmp+tx]=image[a++];
  280.         }
  281.         tmp=tmp+80;
  282.      }
  283.   }
  284. }
  285.  
  286. PCHAR XLoadImage(char filename[50],char *xs,char *ys)
  287. {
  288.     FILE *img;
  289.     int i2=0;
  290.     char ix,iy;
  291.     char *image;
  292.  
  293.     img=fopen(filename,"rb");
  294.     if (img==NULLHANDLE){
  295.        return NULL;
  296.        DosBeep(1000,100);
  297.     }
  298.     ix=fgetc(img);iy=fgetc(img);
  299.     image=malloc(ix*iy);
  300.     for (i2=0;i2<64;i2++) {
  301.        image[0+i2]=fgetc(img);
  302.        image[64+i2]=fgetc(img);
  303.        image[128+i2]=fgetc(img);
  304.        image[(128+64)+i2]=fgetc(img);
  305.     }
  306.     *xs=ix;
  307.     *ys=iy;
  308.     return image;
  309. }
  310.  
  311.  
  312. void XCBltImage(int x,int y, struct IMAGE_TABLE *image)
  313. {
  314.   USHORT loc,tmp,tx,ty;
  315.   char c,StartPlane;
  316.   USHORT a=0,pagenum;
  317.   USHORT page[4]={0x102,0x0202,0x0402,0x0802};
  318.  
  319.   StartPlane=(x & 0x03);
  320.   loc=((y * (SCREEN_Width<<2))+(x>>2))+(19200*ActivePage);
  321.  
  322.   for (pagenum=0;pagenum<4;pagenum++){
  323.      tmp=loc;
  324.      outpw(SC_INDEX,page[StartPlane]);  
  325.      StartPlane=StartPlane + 1;
  326.      if (StartPlane==4) {
  327.         StartPlane=0;
  328.         loc++;
  329.      }
  330.      draw(image->img[pagenum],screen + tmp);
  331.   }
  332. }
  333.  
  334. XSetRGB(char color,char red,char green,char blue)
  335. {
  336.    outp(0x3c8,color);
  337.    outp(0x3c9,red);
  338.    outp(0x3c9,green);
  339.    outp(0x3c9,blue);
  340. }
  341.  
  342. #define pn(x) (797-((255-x)*3))
  343.  
  344. XLoadCel(char filename[60],char *where)
  345. {
  346.    char *tmp,c;
  347.    int i;
  348.    char pal[800];
  349.    FILE *cel;
  350.  
  351.    cel=fopen(filename,"rb");
  352.    tmp=malloc(64000);
  353.    for (i=0;i<800;i++) {
  354.       pal[i]=fgetc(cel);
  355.    } 
  356.    for (i=255;i>=0;i--) {
  357.       XSetRGB(i,pal[pn(i)],pal[pn(i)+1],pal[pn(i)+2]);
  358.    } 
  359.  
  360.    for (i=0;i<64000;i++) {
  361.       tmp[i]=fgetc(cel);
  362.    } 
  363.  
  364.    outpw(SC_INDEX,0x102);
  365.    for (i=0;i<64000;i=i+4) {
  366.       where[(i>>2)]=tmp[i];
  367.    } 
  368.    outpw(SC_INDEX,0x202);
  369.    for (i=1;i<64000;i=i+4) {
  370.       where[(i>>2)]=tmp[i];
  371.    }
  372.    outpw(SC_INDEX,0x402);
  373.    for (i=2;i<64000;i=i+4) {
  374.       where[(i>>2)]=tmp[i];
  375.    }
  376.    outpw(SC_INDEX,0x802);
  377.    for (i=3;i<64000;i=i+4) {
  378.       where[(i>>2)]=tmp[i];
  379.    }
  380. }
  381.  
  382.  
  383. XCLoadImage(char filename[60],struct IMAGE_TABLE *image)
  384. {
  385.     USHORT size[4],tmp;
  386.     FILE *sprite;
  387.     char hi,lo,i,*spr;
  388.  
  389.     sprite=fopen(filename,"rb");
  390.     for (i=0;i<4;i++) {
  391.         lo=fgetc(sprite);
  392.         hi=fgetc(sprite);
  393.         size[i]=(hi<<8)+lo;
  394.     }
  395.     for (i=0;i<4;i++) {
  396.         image->img[i]=malloc(size[i]);
  397.         spr=image->img[i];
  398.         for (tmp=0;tmp<size[i];tmp++) {
  399.             spr[tmp]=fgetc(sprite);
  400.         }
  401.     } 
  402.     return 0;
  403. }
  404.  
  405.  
  406.